package db

import (
	"errors"

	"gorm.io/gorm"

	"api/config"
	"api/loger"
)

// 根据课程名称删除一个课程
func DeleteCourseByName(courseName string) (err error, isExist bool) {
	// 检查课程名称是否存在
	isExist = checkCourseNameExist(courseName)
	// 如果课程不存在，直接返回
	if !isExist {
		return nil, isExist
	}
	// 执行删除操作
	err = postdb.Where("course_name =?", courseName).Delete(&Course{}).Error
	if err != nil {
		// 记录错误日志
		loger.Loger.Println("error: DeleteCourseByName", err, "courseName:", courseName)
		return err, isExist
	}

	// 删除成功，返回 nil 错误和 notExist 标志
	return nil, isExist
}

// 新增一个课程,成功返回nil和true。失败返回error，可能返回.false名称重复
func InsertNewCourse(adminId, recommendMaxNum, recommendMinNum int, courseName, courseSubject, introduction, introductionURL string, isGroup, isTeam, isVIP bool) (err error, isUnique bool) {
	course := &Course{
		AdminId:         0,
		CourseName:      config.Config.NewCourseDefaultInfo.CourseName,
		CourseSubject:   config.Config.NewCourseDefaultInfo.CourseSubject,
		IntroductionURL: config.Config.NewCourseDefaultInfo.Introduction,
		Introduction:    config.Config.NewCourseDefaultInfo.IntroductionURL,
		IsGroupType:     true,
		IsTeamType:      false,
		IsVipType:       false,
		RecommendMaxNum: recommendMaxNum,
		RecommendMinNum: recommendMinNum,
	}
	if checkCourseNameExist(courseName) {
		return errors.New("课程名称重复,请另外挑选新的"), false
	}
	course.AdminId = adminId
	course.CourseName = courseName
	course.CourseSubject = courseSubject
	course.Introduction = introduction
	course.IntroductionURL = introductionURL
	course.IsGroupType = isGroup
	course.IsTeamType = isTeam
	course.IsVipType = isVIP
	course.RecommendMaxNum = recommendMaxNum
	course.RecommendMinNum = recommendMinNum

	err = postdb.Model(&Course{}).Create(course).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 创建课程时出现了错误", err.Error())
		return err, false
	}
	return nil, true
}

// 检查课程是否名称是否存在
func checkCourseNameExist(courseName string) (isUnique bool) {
	var count int64
	err := postdb.Model(&Course{}).Where("course_name=?", courseName).Count(&count).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误,找到课程名称为 ", courseName, "的课程时出现了错误", err.Error())
	}
	return count > 0
}

// 检索所有课程
func SelectCourse() (courses []Course, err error) {
	err = postdb.Find(&courses).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询所有课程时出现了错误", err.Error())
		return nil, err
	}
	return courses, nil
}

// 全新版本,现在这个能查到大量信息
// 具体为,有哪些卡可以上这个课程,有哪些班级正在上这门课
func SelectCourseInfo(courseId int) (course CourseInfo, err error) {
	//首先查看这门课程的基本信息
	err = postdb.Model(&Course{}).Where("course_id=?", courseId).First(&course.CourseInfo).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询课程id为 ", courseId, "的课程基本信息时出现了错误", err.Error())
		return CourseInfo{}, err
	}
	//检索班级列表中有哪些班级是这个课程而且在课表中安排了的,如果找到了就把详细信息放在切片中
	err = postdb.Model(&ClassList{}).Where("already_active=? AND course_id=?", true, courseId).Find(&course.ClassInfo).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询课程id为 ", courseId, "的课程的有关班级时出现了错误", err.Error())
		return CourseInfo{}, err
	}
	//检索会员卡列表中哪些会员卡是可以支持这个course,我觉得可能会在以后使用得到,所以给出单独的公共函数
	course.CardInfo, err = WhichCardSupportThisCourse(courseId)
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询课程id为 ", courseId, "的课程的有关会员卡时出现了错误", err.Error())
		return CourseInfo{}, err
	}
	return course, nil
}
func SelectCourseTypeByCourseId(courseId int) (courseType int, err error) {
	var course Course
	err = postdb.Where("id=?", courseId).First(&course).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询课程id为 ", courseId, "的课程时出现了错误", err.Error())
		return 0, err
	}
	if course.IsVipType {
		return 0, nil
	}
	if course.IsTeamType {
		return 1, nil
	}
	if course.IsGroupType {
		return 2, nil
	}
	return -1, errors.New("课程错误，请联系管理员")
}

// 这里的courseinfoi就是普通的course
func SelectCourseInfoByClassId(classId int) (courseInfo Course, err error) {
	var class ClassList
	err = postdb.Model(&ClassList{}).Where("class_id =?", classId).First(&class).Error
	if err != nil {
		return Course{}, err
	}
	err = postdb.Model(&Course{}).Where("course_id=?", class.CourseId).First(&courseInfo).Error
	if err != nil {
		return Course{}, err
	}
	return courseInfo, nil
}
func SelectCourseInfoByCourseId(courseId int) (courseInfo Course, err error) {
	err = postdb.Model(&Course{}).Where("course_id=?", courseId).First(&courseInfo).Error
	return courseInfo, err
}

// 找到所有这个卡支持的课程,首先必须声明,因为添加课程是在gui内进行,而且是由管理员进行操作,所以不对混乱的记录负责,只需要做到能对正常的课程负责即可
func WhichCourseSupportedByThisCard(cardId int) (supportedCourse []Course, err error) {
	// 分解为三个步骤
	// 找到这个会员卡的信息
	var cardInfo CardList
	err = postdb.Model(&CardList{}).Where("card_id=?", cardId).First(&cardInfo).Error
	if err != nil {
		loger.Loger.Println("error: 出现错误, 查询会员卡id为 ", cardId, "的会员卡时出现了错误", err.Error())
		return nil, err
	}
	// 找到这个会员卡禁止的课程

	var forbidCourse []int
	err = postdb.
		Model(&CardForbidList{}).
		Where("card_id=?", cardInfo.CardId).
		Pluck("course_id", &forbidCourse).
		Error

	if err != nil && err != gorm.ErrRecordNotFound {
		loger.Loger.Println("error: 出现错误, 查询会员卡id为 ", cardId, "的会员卡禁止的课程时出现了错误", err.Error())
		return nil, err
	}
	// 找到这个会员卡可以默认支持的课程
	//这里的逻辑是查找所有course中任何一个type能和card中任何一个支持的type都为true的,即为支持
	err = postdb.
		Model(&Course{}).
		Where("(is_group_type AND ?) OR (is_team_type AND ?) OR (is_vip_type AND ?)", cardInfo.IsSupportGroup, cardInfo.IsSupportTeam, cardInfo.IsSupportVIP).
		Where("course_id not in ?", forbidCourse).
		Find(&supportedCourse).
		Error
	if err != nil && err != gorm.ErrRecordNotFound {
		loger.Loger.Println("error: 出现错误, 查询会员卡id为 ", cardId, "的会员卡可以默认支持的课程时出现了错误", err.Error())
		return nil, err
	}
	var supportCourseId []int
	// 添加特殊支持的课程
	err = postdb.
		Model(&CardSupportList{}).
		Where("card_id=?", cardInfo.CardId).
		Pluck("course_id", &supportCourseId).
		Error
	if err != nil && err != gorm.ErrRecordNotFound {
		loger.Loger.Println("error: 出现错误, 查询会员卡id为 ", cardId, "的会员卡特殊支持的课程时出现了错误", err.Error())
		return nil, err
	}

	var supportCourse []Course
	err = postdb.Model(&Course{}).Where("course_id IN ?", supportCourseId).Find(&supportCourse).Error
	if err != nil && err != gorm.ErrRecordNotFound {
		loger.Loger.Println("error: 出现错误, 查询课程id为 ", supportCourseId, "的课程时出现了错误", err.Error())
		return nil, err
	}
	supportedCourse = append(supportedCourse, supportCourse...)

	return supportedCourse, nil
}
